<%@ page import="org.apache.commons.fileupload.servlet.ServletFileUpload" %>
<%@ page import="org.apache.commons.fileupload.FileItemFactory" %>
<%@ page import="org.apache.commons.fileupload.disk.DiskFileItemFactory" %>
<%@ page import="org.apache.commons.fileupload.FileItem" %>
<%@ page import="java.util.List" %>
<%@ page import="java.io.File" %>
<%@ page import="java.text.SimpleDateFormat" %>
<%@ page import="java.util.Date" %>
<%@ page import="java.io.PrintWriter" %><%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2020/6/5
  Time: 14:57
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>文件上传处理程序</title>
</head>
<body>

<%
    request.setCharacterEncoding("UTF-8");

    // 判断这个请求对象，携带的表单信息是否具有那个encType描述,不是不处理
    if (ServletFileUpload.isMultipartContent(request)){

        // ServletFileUpload实例需要此工厂接口的实例的注入才能初始化
        FileItemFactory fileItemFactory = new DiskFileItemFactory();
        ServletFileUpload servletFileUpload = new ServletFileUpload(fileItemFactory);

        // 对请求中的表单信息进行解析,得到表单项元素的集合
        List<FileItem> fileItemList = servletFileUpload.parseRequest(request);

        // 遍历集合
        for (FileItem fileItem:fileItemList) {

            // 判断是不是普通表单项元素，不是则是文件项元素了
            if (fileItem.isFormField()){
                // 对普通表单项元素 如何处理

                // getFieldName() 获取这个表单项元素name属性的值
                String fieldName = fileItem.getFieldName();

                // getString() 获取这个表单项元素的value的值，
                // 因为是post请求，如果不设置编码，就会导致值字符乱码，所以可以注入编码参数 getString("utf-8")
                String value = fileItem.getString("utf-8");

                System.out.println("表单项：name = " + fieldName + " value = " + value);
            } else {
                // 对文件项元素 如何处理

                // getFieldName() 获取这个表单项元素name属性的值，在文件项中也是一样
                String fieldName = fileItem.getFieldName();

                // 获取文件名称 getName()
                String fileItemName = fileItem.getName();

                System.out.println("文件项 ：name = " + fieldName + " 文件名 = " + fileItemName);

                // ---------------------- 存储实现细节 ---------------------

                // 动态的获取和设置真实物理地址的存储路径
                String storagePath = request.getSession().getServletContext().getRealPath("/upload/");

                // 如果这个路径没有就创建一个出来
                File storagePosition = new File(storagePath);
                if (!storagePosition.exists()) {
                    // mkdirs 允许创建多层级目录
                    storagePosition.mkdirs();
                }

                System.out.println("真实存储地址：" + storagePath);

                // 获取文件类型【通过最后一个.后面的字符串】
                int the_cut_index = fileItemName.lastIndexOf('.');
                String fileType = fileItemName.substring(the_cut_index);

                // 按照时间戳的形式，给文件重新命名
                String timestamp = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());

                // 最终要存储的上传文件为这样：
                File the_upload_file = new File(storagePath, timestamp + fileType);

                // 写入文件
                fileItem.write(the_upload_file);

                // 数据库存储这个文件的物理地址位置，要下载时再细说把
                String location = storagePath + timestamp + fileType;
                System.out.println("文件地址：" + location);
            }
        }
    }
%>

</body>
</html>
